// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/surfaces/surface.h"
#include "cc/surfaces/surface_factory.h"
#include "cc/surfaces/surface_factory_client.h"
#include "cc/surfaces/surface_id_allocator.h"
#include "cc/surfaces/surface_manager.h"
#include "cc/test/scheduler_test_common.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/size.h"

namespace cc {
namespace {

    static const FrameSinkId kArbitraryFrameSinkId(1, 1);

    class FakeSurfaceFactoryClient : public SurfaceFactoryClient {
    public:
        FakeSurfaceFactoryClient()
            : begin_frame_source_(nullptr)
        {
        }

        void ReturnResources(const ReturnedResourceArray& resources) override { }

        void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override
        {
            begin_frame_source_ = begin_frame_source;
        }

        BeginFrameSource* begin_frame_source() { return begin_frame_source_; }

    private:
        BeginFrameSource* begin_frame_source_;
    };

    TEST(SurfaceTest, SurfaceLifetime)
    {
        SurfaceManager manager;
        FakeSurfaceFactoryClient surface_factory_client;
        SurfaceFactory factory(kArbitraryFrameSinkId, &manager,
            &surface_factory_client);

        LocalFrameId local_frame_id(6, base::UnguessableToken::Create());
        SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id);
        factory.SubmitCompositorFrame(local_frame_id, CompositorFrame(),
            SurfaceFactory::DrawCallback());
        EXPECT_TRUE(manager.GetSurfaceForId(surface_id));
        factory.EvictSurface();

        EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id));
    }

    TEST(SurfaceTest, SurfaceIds)
    {
        for (size_t i = 0; i < 3; ++i) {
            SurfaceIdAllocator allocator;
            LocalFrameId id1 = allocator.GenerateId();
            LocalFrameId id2 = allocator.GenerateId();
            EXPECT_NE(id1, id2);
        }
    }

} // namespace
} // namespace cc
